// 该题的第一个问题就是求一个最大下降子序列
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 1010;
int n = 1;
int h[N], q[N], f[N];
int main()
{
    while (cin >> h[n])
        ++n;
    n--;
    // n是导弹的数量
    int len = 0;
    for (int i = 1; i <= n; ++i)
    {
        // 阶层高，数值越低
        int l = 0, r = len;
        while (l < r)
        {
            int mid = (l + r + 1) >> 1;
            // 这里要找的是不小于h[i]的最小值
            if (q[mid] >= h[i])
                l = mid;
            else
                r = mid - 1;
        }
        q[r + 1] = h[i];
        len = max(len, r + 1);
    }
    cout << len << endl;
    len = 0;
    memset(q, 0, sizeof(q));
    for (int i = 1; i <= n; ++i)
    {
        int l = 0, r = len;
        // 这里找的是递增序列中不小于h[i]的最小值
        while (l < r)
        {
            int mid = (l + r) >> 1;
            if (q[mid] >= h[i])
                r = mid;
            else
                l = mid + 1;
        }
        // 出循环后，如果指向的数仍然比h[i]小,那就需要新开一个炮台
        if (q[l] < h[i])
            q[++len] = h[i];
        else
            q[l] = h[i];
    }
    cout << len << endl;
    return 0;
}